<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <script>
            // 函数进阶
            // 1. 函数提升：函数声明会提升到当前作用域的最前面
            // 如果是函数表达式，只会提升变量名，不会提升函数，所以必须先声明后调用 var fn = function() {}

            // 2. 函数参数：动态参数和剩余参数
            // 2.1 动态参数：arguments 是函数内置的伪数组，可以获取函数的所有参数
            function test(a) {
                console.log(arguments);
            }

            console.log(test(1, 2, 3, 4, 5)); // [1, 2, 3, 4, 5]

            // 2.2 剩余参数：...rest，可以获取函数的剩余参数 rest 是一个真数组，不是伪数组
            function test2(a, b, ...rest) {
                console.log(rest);
            }

            // 3. 箭头函数 ：适用于匿名函数
            // 3.1 箭头函数没有 this，this 是继承自父作用域
            // 3.2 箭头函数没有 arguments，可以使用剩余参数代替
            // 只有一个参数时，可以省略括号 只有一行代码时，可以省略大括号 和 return
            const fn = a => a + 1;
            // 可以返回一个对象，但是需要用小括号包裹
            const fn2 = a => ({name: a});
            console.log(fn2(1)); // 打印 {name: 1}



        </script>

    </body>
</html>